//树状数组方案
#include <bits/stdc++.h>
using namespace std;

// 定义常量N，用于树状数组大小
const int N = 500005;

// 树状数组结构体定义
struct BIT {
  // 树状数组存储空间
  int t[N];

  // 计算x的最低位1所代表的值
  int lowbit(int x) { return x & (-x); }

  // 在位置x处增加v值（支持差分数组的区间修改）
  void add(int x, int v) {
    // 当x不超过最大范围时继续更新
    while (x <= 500001) {
      t[x] += v;
      x += lowbit(x);
    }
  }

  // 查询从1到x的前缀和
  int ask(int x) {
    int res = 0;
    // 当x大于0时继续累加
    while (x) {
      res += t[x];
      x -= lowbit(x);
    }
    return res;
  }
} bit;

// 二分查找函数：找到第一个前缀和大于等于x的位置
int bsearch(int x) {
  int l = 0, r = 500001, ans;
  // 二分查找范围[0, 500001]
  while (l <= r) {
    int mid = (l + r) / 2;
    // 如果当前位置的前缀和大于等于x，则向左查找更小的位置
    if (bit.ask(mid) >= x)
      r = mid - 1, ans = mid;
    // 否则向右查找更大的位置
    else
      l = mid + 1;
  }
  return ans;
}

int main() {
  //  竞赛数量n
  int n;
  cin >> n;

  // 初始化树状数组：使bit.ask(i) = i
  // 这样初始化是为了让每个初始评分i的基础得分就是i
  for (int i = 1; i <= 500001; ++i)
    bit.add(i, 1); // 初始让t[i]=i  ask(i) -> t[i]

  // 处理每一场竞赛
  for (int i = 1; i <= n; ++i) {
    // 读入第i场竞赛的评分区间[L,R]
    int l, r;
    cin >> l >> r;

    // 找到第一个评分值大于等于l的位置（区间左边界）
    int rl = bsearch(l);
    // 找到第一个评分值大于r的位置（区间右边界）
    int rr = bsearch(r + 1);

    // 使用差分思想进行区间更新：
    // 在位置rl处+1，表示从rl开始后面的评分都增加1分
    bit.add(rl, 1);
    // 在位置rr处-1，表示从rr开始后面的评分减少1分
    // 这样就实现了区间[rl, rr-1]内所有评分都增加1分的效果
    bit.add(rr, -1);
  }

  // 读入查询数量q
  int q;
  cin >> q;

  // 处理每个查询
  while (q--) {

    int x; // 读入初始评分x
    cin >> x;
    // 输出最终评分：bit.ask(x)就是初始评分为x时的最终评分
    cout << bit.ask(x) << endl;
  }

  return 0;
}